home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gekkan Dennou Club 147
/
Gekkan Dennou Club - 2000.8 Vol. 147 (Japan).7z
/
Gekkan Dennou Club - 2000.8 Vol. 147 (Japan) (Track 1).bin
/
games
/
ippon
/
source.lzh
/
effect.c
next >
Wrap
C/C++ Source or Header
|
2000-07-07
|
2KB
|
108 lines
/* effect.c */
#include <stdio.h>
#include <xsp2lib.h>
#include "main.h"
#include "effect.h"
#define EFFECT_MAX 32 /* エフェクト最大数 */
static EFFECT effect[EFFECT_MAX]; /* ワーク */
static EFFECT *effect_top, /* 使用中のワークのリスト */
*effect_null_top; /* 空のワークのリスト */
/* 初期化関数へのポインタの配列 */
typedef void (*effect_alloc) (EFFECT *);
effect_alloc EffectAllocFunc[] =
{
EffectAllocExplZako,
EffectAllocExpl,
EffectAllocExplPlayer,
EffectAllocPoints,
};
int points_table2[] =
{
100, 200, 300, 400, 500, 600, 700, 800, 900, 1000,
1200, 1500, 1800, 2000, 2500, 3000, 4000, 5000, 6000, 7000,
8000, 9000, 10000, 12000, 15000, 18000, 20000, 25000, 28000, 30000
};
/* ゲーム開始時に呼ばれる */
void EffectInit (void)
{
int i;
/* リストをつなげる */
effect_top = NULL;
effect_null_top = effect;
for (i = 0; i < EFFECT_MAX; i++)
effect[i].next = &effect[i + 1];
effect[EFFECT_MAX - 1].next = NULL;
points_table[0] = 0; /* 100点 */
points_table[1] = 1; /* 200点 */
points_table[2] = 3; /* 400点 */
points_table[3] = 7; /* 800点 */
}
/* エフェクト出現時に呼ばれる */
void EffectAlloc (short type, short type2, short x, short y)
{
EFFECT *p;
if (effect_null_top == NULL)
return; /* 空きのワークがない(キャラクターオーバー) */
p = effect_null_top;
effect_null_top = p->next;
p->next = effect_top;
effect_top = p;
p->type = type;
p->type2 = type2;
p->x = x;
p->y = y;
/* 関数へのポインタを使って分岐 */
EffectAllocFunc[p->type] (p);
}
/* 垂直同期ごとに呼ばれる */
void EffectMove (void)
{
EFFECT *p, *q;
p = effect_top; /* 現在注目しているワーク */
q = NULL; /* 1つ前のワーク(ワーク削除時に必要) */
while (p != NULL) {
/* 移動ルーチンへ飛ぶ(関数へのポインタってヤツ) */
if ((p->func_effect_move) (p)) { /* 返り値が非0なら消去 */
if (q == NULL) { /* リストの一番最初を削除 */
effect_top = p->next;
p->next = effect_null_top;
effect_null_top = p;
q = NULL;
p = effect_top;
} else {
q->next = p->next;
p->next = effect_null_top;
effect_null_top = p;
p = q->next;
}
} else {
q = p;
p = p->next;
}
}
}